#pragma once

namespace fem_smooth {

struct FemPosDeviationSmootherConfig {
  double weight_fem_pos_deviation_;
  double weight_ref_deviation_;
  double weight_path_length_;
  bool apply_curvature_constraint_;
  double weight_curvature_constraint_slack_var_;
  double curvature_constraint_;
  bool use_sqp_;
  double sqp_ftol_;
  double sqp_ctol_;
  int sqp_pen_max_iter_;
  int sqp_sub_max_iter_;
  int max_iter_;
  double time_limit_;
  bool verbose_;
  bool scaled_termination_;
  bool warm_start_;
  int print_level_;
  int max_num_of_iterations_;
  int acceptable_num_of_iterations_;
  double tol_;
  double acceptable_tol_;
 
  FemPosDeviationSmootherConfig() {
    weight_fem_pos_deviation_ = 1.0e10;
    weight_ref_deviation_ = 1.0;
    weight_path_length_ = 1.0;
    apply_curvature_constraint_ = false;
    weight_curvature_constraint_slack_var_ = 1.0e2;
    curvature_constraint_ = 0.2;
    use_sqp_ = false;
    sqp_ftol_ = 1e-4;
    sqp_ctol_ = 1e-3;
    sqp_pen_max_iter_ = 10;
    sqp_sub_max_iter_ = 100;
    max_iter_ = 500;
    time_limit_ = 0.0;
    verbose_ = false;
    scaled_termination_ = true;
    warm_start_ = true;
    print_level_ = 0;
    max_num_of_iterations_ = 500;
    acceptable_num_of_iterations_ = 15;
    tol_ = 1e-8;
    acceptable_tol_ = 1e-1;
  }
  
  double weight_fem_pos_deviation() { return weight_fem_pos_deviation_; }
  double weight_ref_deviation() { return weight_ref_deviation_; }
  double weight_path_length() { return weight_path_length_; }
  bool apply_curvature_constraint() { return apply_curvature_constraint_; }
  double weight_curvature_constraint_slack_var() { return weight_curvature_constraint_slack_var_; }
  double curvature_constraint() { return curvature_constraint_; }
  bool use_sqp() { return use_sqp_; }
  double sqp_ftol() { return sqp_ftol_; }
  double sqp_ctol() { return sqp_ctol_; }
  int sqp_pen_max_iter() { return sqp_pen_max_iter_; }
  int sqp_sub_max_iter() { return sqp_sub_max_iter_; }
  int max_iter() { return max_iter_; }
  double time_limit() { return time_limit_; }
  bool verbose() { return verbose_; }
  bool scaled_termination() { return scaled_termination_; }
  bool warm_start() { return warm_start_; }
  int print_level() { return print_level_; }
  int max_num_of_iterations() { return max_num_of_iterations_; }
  int acceptable_num_of_iterations() { return acceptable_num_of_iterations_; }
  double tol() { return tol_; }
  double acceptable_tol() { return acceptable_tol_; }
};

}  // namespace smooth